/*
 * Copyright (C) 2020 Agrui
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdlib.h>
#include <Handler.h>
#include <MessageQueue.h>
#include <HandlerType.h>


Handler* newHandler(handleMessageFuncType handlerFunc) {
    Handler* handler = (Handler*)malloc(sizeof(Handler));
    if (!handler) {
        return NULL;
    }

    handler->mLooper = myLooper();

    if (handler->mLooper == NULL) {
        free(handler);
        return NULL;
    }

    handler->handlerFunc = handlerFunc;
    handler->mQueue = handler->mLooper->mQueue;
    return handler;
}

void deleteHandler(Handler* handler) {
    if (handler) {
       free(handler); 
    }

}

static void handleMessage(Handler* handler, Message* msg) {
    if (!handler || !msg || !handler->handlerFunc) {
        return;
    }

    (*handler->handlerFunc)(msg);
}

void dispatchMessage(Handler* handler, Message* msg) {
    handleMessage(handler, msg);
}


Message* handlerObtainMessage(Handler* handler, int what, void* obj) {
    return messageObtain(handler, what, obj);
}

boolean handlerSendMessage(Handler* handler, Message* msg) {
    if (!handler || !msg || !handler->mQueue) {
        return FALSE;
    }

    return enqueueMessage(handler->mQueue, msg);
}


